﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Locadora.TOB;
namespace Locadora.BLL.DAL
{
    class LocacaoDAL
    {
        internal static List<TB_LOCACAO> Listar()
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            var result = from c in dc.TB_LOCACAOs orderby c.DT_LOCACAO descending select c;
            List<TB_LOCACAO> lista = null;
            foreach (var item in result)
            {
                lista = result.ToList<TB_LOCACAO>();
                break;
            }
            dc.Dispose();
            return lista;
        }

        internal static TB_LOCACAO Listar(decimal? id)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            TB_LOCACAO result = (from c in dc.TB_LOCACAOs where c.CO_SEQ_LOCACAO == id select c).First();
            dc.Dispose();
            return result;
        }

        internal static List<TB_LOCACAO> ListarByUsuario(string idUsuario)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            var result = (from c in dc.TB_LOCACAOs where c.CO_USUARIO == idUsuario orderby c.DT_LOCACAO descending select c);
            List<TB_LOCACAO> lista = null;
            foreach (var item in result)
            {
                lista = result.ToList<TB_LOCACAO>();
                break;
            }
            dc.Dispose();
            return lista;
        }


        internal static List<TB_LOCACAO> ListarLocadoByUsuario(string idUsuario)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            var result = (from c in dc.TB_LOCACAOs where c.CO_USUARIO == idUsuario && (c.ST_LOCACAO == (int)Enumeracao.SituacaoLocacao.Solicitado || c.ST_LOCACAO == (int)Enumeracao.SituacaoLocacao.Aceito)  orderby c.DT_LOCACAO descending 
                          select c);
            List<TB_LOCACAO> lista = null;
            foreach (var item in result)
            {
                lista = result.ToList<TB_LOCACAO>();
                break;
            }
            dc.Dispose();
            return lista;
        }

        internal static List<LocacaoTOB> IqueryableListarLocadoByUsuario(string idUsuario)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            var result = from c in dc.TB_LOCACAOs
                         where c.CO_USUARIO == idUsuario
                         && (c.ST_LOCACAO == (int)Enumeracao.SituacaoLocacao.Aceito || c.ST_LOCACAO == (int)Enumeracao.SituacaoLocacao.Solicitado || c.ST_LOCACAO == (int)Enumeracao.SituacaoLocacao.Reserva)
                         orderby c.DT_LOCACAO descending
                         select new LocacaoTOB{ CO_DVD = c.CO_DVD, CO_SEQ_LOCACAO=c.CO_SEQ_LOCACAO, CO_USUARIO= c.CO_USUARIO, DT_DEVOLUCAO= c.DT_DEVOLUCAO, DT_LOCACAO=c.DT_LOCACAO, 
                             DS_TITULO=c.TB_DVD.DS_TITULO, ST_LOCACAO = c.ST_LOCACAO,
                             ST_QUALIFICADO = c.TB_CLASSIFICACAOs.Where(cl => cl.CO_LOCACAO == c.CO_SEQ_LOCACAO).Count() > 0 ? true : false
                         };
            List<LocacaoTOB> lista = null;
            foreach (var item in result)
            {
                lista = result.ToList<LocacaoTOB>();
                break;
            }
            dc.Dispose();
            return lista;
        }

        internal static List<TB_LOCACAO> ListarByDvd(decimal idDvd)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            var result = (from c in dc.TB_LOCACAOs where c.CO_DVD == idDvd select c);
            List<TB_LOCACAO> lista = null;
            foreach (var item in result)
            {
                lista = result.ToList<TB_LOCACAO>();
                break;
            }
            dc.Dispose();
            return lista;
        }

        internal static void Inserir(TB_LOCACAO tb)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            dc.TB_LOCACAOs.InsertOnSubmit(tb);
            dc.SubmitChanges();
            dc.Dispose();
        }

        internal static void Excluir(TB_LOCACAO tb)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            TB_LOCACAO result = (from c in dc.TB_LOCACAOs where c.CO_SEQ_LOCACAO == tb.CO_SEQ_LOCACAO select c).First();
            dc.TB_LOCACAOs.DeleteOnSubmit(result);
            dc.SubmitChanges();
            dc.Dispose();
        }

        internal static void Devolver(decimal p,decimal coLocacao)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            TB_LOCACAO result = (from c in dc.TB_LOCACAOs where c.CO_DVD == p && c.CO_SEQ_LOCACAO==coLocacao select c).First();
            result.ST_LOCACAO = (int)Enumeracao.SituacaoLocacao.Devolvido;
            dc.SubmitChanges();
            dc.Dispose();
        }

       

        internal static List<LocacaoTOB> IqueryableListarSolicitadoParaUsuario(string p)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            var result = from c in dc.TB_LOCACAOs
                         join d in dc.TB_DVDs on c.CO_DVD equals d.CO_SEQ_DVD
                         where d.CO_PROPRIETARIO == p //&& c.ST_DEVOLVIDO == null
                         orderby c.DT_DEVOLUCAO descending
                         select new LocacaoTOB
                         {
                             CO_DVD = c.CO_DVD,
                             CO_SEQ_LOCACAO = c.CO_SEQ_LOCACAO,
                             CO_USUARIO = c.CO_USUARIO,
                             DT_DEVOLUCAO = c.DT_DEVOLUCAO,
                             DT_LOCACAO = c.DT_LOCACAO,
                             
                             DS_TITULO = c.TB_DVD.DS_TITULO,
                             ST_LOCACAO = c.ST_LOCACAO
                         };

            List<LocacaoTOB> lista = null;
            foreach (var item in result)
            {
                lista = result.ToList<LocacaoTOB>();
                break;
            }
            dc.Dispose();
            return lista;
        }

        internal static void Aprovar(decimal p, decimal coLocacao)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            TB_LOCACAO result = (from c in dc.TB_LOCACAOs where c.CO_DVD == p && c.CO_SEQ_LOCACAO == coLocacao select c).First();
            result.DT_DEVOLUCAO = DateTime.Now.AddDays(5);
            result.ST_LOCACAO = (int)Enumeracao.SituacaoLocacao.Aceito;
            dc.SubmitChanges();
            dc.Dispose();
        }

        internal static void NaoAprovar(decimal id, decimal coLocacao)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            TB_LOCACAO result = (from c in dc.TB_LOCACAOs where c.CO_DVD == id && c.CO_SEQ_LOCACAO == coLocacao select c).First();
            result.ST_LOCACAO = (int)Enumeracao.SituacaoLocacao.Negado;//negado
            dc.SubmitChanges();
            dc.Dispose();
        }

        internal static List<LocacaoTOB> IqueryableListarSolicitadoParaUsuario(int start, int offset, string p)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            var result = (from c in dc.TB_LOCACAOs
                         join d in dc.TB_DVDs on c.CO_DVD equals d.CO_SEQ_DVD
                         where d.CO_PROPRIETARIO == p //&& c.ST_DEVOLVIDO == null
                          orderby c.DT_LOCACAO descending
                         select new LocacaoTOB
                         {
                             CO_DVD = c.CO_DVD,
                             CO_SEQ_LOCACAO = c.CO_SEQ_LOCACAO,
                             CO_USUARIO = c.CO_USUARIO,
                             DT_DEVOLUCAO = c.DT_DEVOLUCAO,
                             DT_LOCACAO = c.DT_LOCACAO,
                             
                             DS_TITULO = c.TB_DVD.DS_TITULO,
                             ST_LOCACAO = c.ST_LOCACAO,
                             ST_QUALIFICADO = c.TB_CLASSIFICACAOs.Where(cl=>cl.CO_LOCACAO==c.CO_SEQ_LOCACAO).Count() > 0 ? true:false
                         }).Skip(start).Take(offset);

            List<LocacaoTOB> lista = null;
            foreach (var item in result)
            {
                lista = result.ToList<LocacaoTOB>();
                break;
            }
            dc.Dispose();
            return lista;

        }

        internal static int GetTotalLocacoes(string p)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            var result = from c in dc.TB_LOCACAOs
                         join d in dc.TB_DVDs on c.CO_DVD equals d.CO_SEQ_DVD
                         where d.CO_PROPRIETARIO == p select c;
            int total = result.Count();
            dc.Dispose();
            return total;
        }

        internal static void Cancelar(decimal id, decimal coLocacao)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            TB_LOCACAO result = (from c in dc.TB_LOCACAOs where c.CO_DVD == id && c.CO_SEQ_LOCACAO == coLocacao select c).First();
            result.ST_LOCACAO = (int)Enumeracao.SituacaoLocacao.Cancelado;
            dc.SubmitChanges();
            dc.Dispose();
        }

        internal static TB_LOCACAO ListarByLocacao(decimal coLocacao)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            TB_LOCACAO result = (from c in dc.TB_LOCACAOs where c.CO_SEQ_LOCACAO == coLocacao select c).First();
            dc.Dispose();
            return result;
        }

        internal static List<TB_LOCACAO> ListarReservaByUsuario(string p)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            var result = (from c in dc.TB_LOCACAOs
                          where c.CO_USUARIO == p && (c.ST_LOCACAO == (int)Enumeracao.SituacaoLocacao.Reserva)
                          orderby c.DT_LOCACAO descending
                          select c);
            List<TB_LOCACAO> lista = null;
            foreach (var item in result)
            {
                lista = result.ToList<TB_LOCACAO>();
                break;
            }
            dc.Dispose();
            return lista;
        }

        internal static void LiberarReserva(decimal coDvd)
        {
            DataClassesDataContext dc = new DataClassesDataContext();
            TB_LOCACAO result = (from c in dc.TB_LOCACAOs where c.CO_DVD == coDvd && 
                                     c.ST_LOCACAO == (int)Locadora.TOB.Enumeracao.SituacaoLocacao.Reserva orderby c.DT_LOCACAO ascending select c).First();
            if (result != null)
            {
                result.ST_LOCACAO = (int)Locadora.TOB.Enumeracao.SituacaoLocacao.Solicitado;
                dc.SubmitChanges();
            }
            dc.Dispose();
            
        }
    }
}
